package com.bcr.apachService;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
/**
 * 核心处理类
 * @todo TODO
 * @author bcr
 * @date 2016年7月3日
 */
public class Processor extends Thread {
	//核心处理类的属性
	private Socket socket;
	//输入流
	private InputStream in;
	//输出流
	private PrintStream out;
	//资源文件路径（指定访问资源的路径，限定访问位置）
	public final String path = "D:\\WorkFile\\myworkspace\\ApachService\\filepath";
	
	
	//构造方法
	public Processor(Socket socket){
		this.socket = socket;
		try {
			in = socket.getInputStream();
			out = new PrintStream(socket.getOutputStream());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

	//启动线程，处理请求
	public void run(){
		//根据输入流得到文件名
		String fileName = getFileNameByIO(in);
		//根据文件名返回资源给客户端
		sendFile(fileName);
		
		
	}
	
	//根据流获得访问的额资源返回资源名
	public String  getFileNameByIO(InputStream in){
		String resultFileName = null;
		//字节流转为字符流
		BufferedReader br = new BufferedReader(new InputStreamReader(in));
		
		try {
			//得到发送的请求内容的第一行
			String httpMsg = br.readLine();
			//用空格切割成三部分：协议的状态号，请求文件名（资源名），协议版本号
			String[] content = httpMsg.split(" ");
			
			//如果请求内容不是三部分，则请求错误
			if(content.length!=3){
				sendErrorMsg(400, "请求错误");
				return null;
			}
			//输出请求的三部分内容
			System.out.println("协议的状态号code="+content[0]+",请求文件名（资源名）FileName="+content[1]+",协议版本号version="+content[2]);
			resultFileName = content[1];
			
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			
		}
		return resultFileName;
	}
	
	//发送错误消息
	public void sendErrorMsg(int errorCode,String errorMsg){
		out.println("HTTP/1.0 "+errorCode+" "+errorMsg);
		out.println("content-type:text/html");
		out.println();
		out.println("<html>");
		out.println("<head>");
		out.println("<title>Error</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1>出错啦！errorCode："+errorCode+",errorMsg:"+errorMsg+"</h1>");
		
		out.println("</body>");
		out.println("</html>");
		
	}
	
	//返回资源 给客户端
	public void sendFile(String fileName){
		File file = new File(this.path+fileName);
		//如果资源不存在
		if(!file.exists()){
			sendErrorMsg(404, "File Not Found!");
			return ;
		}
		
		try {
			//以子节形式读入文件
			InputStream in = new FileInputStream(file);
			byte[] content = new byte[(int)file.length()];
			in.read(content);
			
			//用输出流返回到
			//http协议前三部分： 代码，状态码，
			out.println("HTTP/1.0 200 queryfile");
			out.println("content-length:"+content.length);//内容长度
			out.println();
			out.write(content);//输出到客户端
			//关闭流
			out.flush();
			out.close();
			in.close();
					
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		}
}
